package com.rustic.server.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rustic.server.enums.LinkType;
import com.rustic.server.po.UserCollectionLink;
import com.rustic.server.query.UserCollectionLinkAdminListQuery;
import com.rustic.server.query.UserCollectionLinkUserListQuery;
import com.rustic.server.vo.list.UserCollectionLinkAdminListVO;
import com.rustic.server.vo.list.UserCollectionLinkWebListVO;

import java.util.List;
import java.util.Map;

/**
 * 表[user_collection_link]对应的服务类
 *
 * @author auto
 */

public interface UserCollectionLinkService extends IService<UserCollectionLink> {

    String USER_COLLECTION_LINK_NOT_EXIST = "用户收藏关联不存在";

    String USER_COLLECTION_LINK_EXIST = "已收藏";

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList id列表
     * @return 用户收藏关联列表
     */
    List<UserCollectionLink> listByIdIn(List<Integer> idList);

    /**
     * 查询（根据ID 批量查询）并转换成Map
     *
     * @param idList id列表
     * @return 用户收藏关联列表
     */
    Map<Integer, UserCollectionLink> mapByIdIn(List<Integer> idList);

    /**
     * 管理列表查询条件
     *
     * @param query 查询参数
     * @return 查询条件
     */
    LambdaQueryWrapper<UserCollectionLink> toAdminListWrapper(UserCollectionLinkAdminListQuery query);

    /**
     * toAdminListVo
     *
     * @param userCollectionLinkList userCollectionLinkList
     * @return AdminListVO
     */
    List<UserCollectionLinkAdminListVO> toAdminListVo(List<UserCollectionLink> userCollectionLinkList);

    /**
     * 前台列表查询条件
     *
     * @param query  查询参数
     * @param userId 用户id
     * @return 查询条件
     */
    LambdaQueryWrapper<UserCollectionLink> toUserListWrapper(UserCollectionLinkUserListQuery query, int userId);

    /**
     * toWebListVo
     *
     * @param userCollectionLinkList userCollectionLinkList
     * @return WebListVo
     */
    List<UserCollectionLinkWebListVO> toWebListVo(List<UserCollectionLink> userCollectionLinkList);

    /**
     * 根据目标id列表和目标类型进行查询，并统计对应目标的收藏数据数量
     *
     * @param targetIdList 目标id列表
     * @param type         目标类型
     * @return Map<Integer, Long> 统计对应目标的数据数量
     */
    Map<Integer, Long> mapByTargetIdAndType(List<Integer> targetIdList, LinkType type);

    /**
     * 根据目标id和目标类型查询收藏数量
     *
     * @param targetId 目标id
     * @param type     类型
     * @return 收藏数量
     */
    Long getByTargetAndType(int targetId, LinkType type);

    /**
     * 根据目标id列表、用户id和类型查询收藏，并转化map
     *
     * @param targetIdList 目标id列表
     * @param type         目标类型
     * @param userId       用户id
     * @return Map<Integer, UserCollectionLink> key:目标id,value:UserCollectionLink
     */
    Map<Integer, UserCollectionLink> mapByUserTargetAndType(List<Integer> targetIdList, LinkType type, int userId);

    /**
     * 用户收藏添加
     *
     * @param userId   用户id
     * @param targetId 目标id
     * @param type     添加数据类型
     * @return String
     */
    String addOrDelCollection(int userId, int targetId, int type);

    /**
     * 根据用户id、目标id和类型查询用户是否有收藏
     *
     * @param userId   用户id
     * @param targetId 目标id
     * @param type     类型
     * @return UserCollectionLink
     */
    UserCollectionLink getByUserTargetAndType(int userId, int targetId, int type);
}
